#ifndef SESSIONFRIENDAREA_H
#define SESSIONFRIENDAREA_H

#include <QWidget>
#include<QScrollArea>
#include<QLabel>
#include<QStyleOption>
#include<QPainter>


//////////////////////////////////////////////////
////// 滚动区域中的Item的类型
//////////////////////////////////////////////////
enum ItemType{
    SessionItemType,
    FriendItemType,
    ApplyItemType
};



//////////////////////////////////////////////////
////// 整个滚动区域的实现
//////////////////////////////////////////////////

class SessionFriendArea : public QScrollArea
{
    Q_OBJECT
public:
    explicit SessionFriendArea(QWidget *parent = nullptr);

    //会话好友区添加item
    //itemtype表示添加哪种item,id对于不同itemtype的意义不同
    //如果是SessionItem,id就是chatSessionId
    //如果是FriendItem/ApplyItem,id就是userId
    void addItem(ItemType itemType, const QString& id, const QIcon& avatarBtn,const QString& nameLabel,const QString& text);

    //清理会话好友区所有的item
    void clear();

    //选中某个指定的item,通过index下标进行选择
    void clickItem(int index);

private:
    //后续往container 内部的layout 中添加元素，就能够触发QScrollArea
    QWidget* container;

signals:
};




//////////////////////////////////////////////////
////// 滚动区域中的Item的实现
//////////////////////////////////////////////////

class SessionFriendItem : public QWidget
{
    Q_OBJECT
public:
    SessionFriendItem(QWidget* owner ,const QIcon& avatar, const QString& name, const QString& text);

    //item是自定义类，需要重写该函数，来使自定义类背景适用全局背景色设置
    void paintEvent(QPaintEvent* event) override;

    //鼠标点击item事件处理，自定义类不好使用槽函数，重写事件
    void mousePressEvent(QMouseEvent* event) override;
    //item选中处理
    void select();
    //鼠标悬停item
    void enterEvent(QEnterEvent* event) override;
    //鼠标离开item
    void leaveEvent(QEvent* event) override;
    //item点击之后激活对应的业务逻辑
    virtual void active();

protected:
    //设置成成员变量方便后面Applyitem拆卸，保护成员便于子类访问
    QLabel* messageLabel;

private:
    //owner指向了SessionFriendArea
    QWidget* owner;
    //表示当前item是否被选中
    bool selected = false;
};


//////////////////////////////////////////////////
////// 会话Item
//////////////////////////////////////////////////

class SessionItem : public SessionFriendItem {
    Q_OBJECT
public:
    SessionItem(QWidget* owner,const QString& chatSessionId,const QIcon& avatar,
                const QString& name,const QString& lastMessage);

    //要在主界面右侧消息展示区，加载出对应的消息列表
    void active() override;

    void updateLastMessage(const QString& chatSessionId);

private:
    //当前会话id
    QString chatSessionId;
};


//////////////////////////////////////////////////
////// 好友的Item
//////////////////////////////////////////////////

class FriendItem : public SessionFriendItem{
    Q_OBJECT
public:
    FriendItem(QWidget* owner,const QString& userId,const QIcon& avatar,
                const QString& name,const QString& description);

    //点击之后，切换到会话列表，并选中对应的会话
    void active() override;

private:
    //好友的用户id
    QString userId;
};


//////////////////////////////////////////////////
////// 好友申请Item
//////////////////////////////////////////////////

class ApplyItem : public SessionFriendItem{
    Q_OBJECT
public:
    //这里不需要附加文本了
    ApplyItem(QWidget* owner,const QString& userId,const QIcon& avatar,
                const QString& name);

    //点击之后，无事发生
    void active() override;

    void acceptFriendApply();
    void rejectFriendApply();

private:
    //好友的用户id
    QString userId;
};

#endif // SESSIONFRIENDAREA_H
